package ACM.meituan2;

/**
 * @Author wwk
 * @DATE 2022/8/27 16:35
 */
import java.util.*;

public class third {
    static int count = 0;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //第一行两个空格隔开的正整数n和m，分别表示大布料S长度和客人要求的小布料数量。

        int n = scanner.nextInt();
        int m = scanner.nextInt();
        //接下来一行一个长度为n的仅包含小写英文字母的串S，表示大布料的组成。
        String S = scanner.next();  //大布料的组成
        //接下来一行m个空格隔开的数x1,x2, ...,xm ，依次表示所要求的小布料长度。
        int[] len = new int[m];
        String[] s = new String[m];
        for (int i = 0; i < len.length; i++){
            len[i] = scanner.nextInt();
        }
        for (int i = 0; i < len.length; i++){
            s[i] = scanner.next();
        }
        //回溯题，将这些字符串组合在一起，如果能和原串相同则加1
        boolean[] used = new boolean[m];
        dfs(s,0,S,new StringBuffer(), used);
        System.out.println(count);
    }

    private static void dfs(String[] s, int start, String S, StringBuffer buf, boolean[] used){
        if(start == s.length){
            String s1 = buf.toString();
            if(s1.equals(S)){
                count++;
            }
            return;
        }
        for(int i = 0; i < s.length; i++){
            if(!used[i]){
                used[i] = true;
                dfs(s,i+1,S,buf.append(s[i]),used);
                used[i] = false;
            }

        }
    }
}
